卷帘功能 Sample详情

最后更新时间:2020年12月11日

功能介绍

地图卷帘功能,即是在同一个地图视图中,能够同时看到两个不同专题的图层数据,进行直观的对比观察。由于地图中的图层是叠加显示的,但有时需要方便地对比查看两个图层的差异,此时就需要使用到地图卷帘功能。通过卷帘功能允许用户轻松地查看某特定图层下面的内容,而无需在内容列表中关闭该图层,从而减少了用户不必要的图层切换操作,同时也能在同一视图中查看指定的两个图层,更直观地进行对比分析,往往用于不用时间专题地图的比对分析,可用于防灾救灾、土地利用现状分析等众多领域中。

MapGIS Mobile提供的卷帘功能效果大体可以分为三类:

功能接口

地图卷帘功能对应API程序包为com.zondy.mapgis.map.view.mapview(10.3版本:com.zondy.mapgis.android.mapview),其核心类为地图视图类MapView。核心接口如下:

接口 说明
swipe(MapLayer swipeLayer, Dots swipeRegionDots)
参数:应用卷帘的图层、卷帘区域
对当前地图中指定图层应用卷帘效果

应用卷帘效果的图层会根据设置的模式擦除部分区域,从而能够看到叠加在此图层之下的其他图层,实现卷帘探查效果。卷帘区域Dots需传递视图坐标,原点在视图的左上角,同时区域必须为闭合区(首尾点应重合)。

特别说明:由于移动端相邻的离线矢量图层是由同一个层渲染器渲染,所以对其中的任一离线矢量图层应用卷帘,会对相邻的所有离线矢量图层都起作用。

实现方法

从地图视图类MapView提供的swipe方法可观察到,需要传入MapLayer对象作为应用卷帘效果的图层,还需传入Dots坐标点集作为图层擦除的区域。所以,从根本上来说,三种不同类型的卷帘效果,只需要构造不同类型的Dots点集合即可,可以传递构成任意图形的点集。

(1)图层准备:首先需要进行地图加载,同时必须保证具有符合卷帘功能的图层数目,由于离线矢量地图相邻的图层由同一个渲染器渲染,所以使用卷帘时所有相邻的离线矢量图层作用效果相同。

(2)构造卷帘区域点集:根据需要构造不同的视图坐标点集合,常用方法是根据手指在地图中的滑动位置来动态构造。

(3)图层卷帘:调用swipe方法实现图层卷帘。

1 水平卷帘

1

地图加载

实现地图显示,叠加谷歌电子地图、影像地图,在地图加载成功后,获取待卷帘的图层MapLayer对象。

    //获取地图容器
    mapView = (MapView) findViewById(R.id.mapview_layer_swipe);

    //添加谷歌影像地图
    serverLayer1 = new ImageLayer();
    MapServer mapServer1 = ImageLayer.createMapServer(MapServer.MAPSERVER_TYPE_GOOGLE_CHINA_MAPSATELLITE);
    serverLayer1.setMapServer(mapServer1);

    //添加谷歌普通地图
    serverLayer2 = new ImageLayer();
    MapServer mapServer2 = ImageLayer.createMapServer(MapServer.MAPSERVER_TYPE_GOOGLE_CHINA_MAP);
    serverLayer2.setMapServer(mapServer2);

    map = new Map();
    map.append(serverLayer1);
    map.append(serverLayer2);
    mapView.setMapAsync(map, new MapViewFinishCallback() {

        @Override
        public void onDidFinish(boolean arg0) {
            // TODO Auto-generated method stub
            if (arg0) {//地图加载成功
                Rect rect = new Rect(12657280.022954, 3499575.599145, 12810933.425540, 3679755.040990);
                mapView.zoomToRange(rect, false);

                //初始给定进行卷帘的图层
                mapLayer = map.getLayer(1);
            } else {//地图加载失败
                Toast.makeText(LayerSwipe_Activity.this, "在线地图加载失败,请确保网络已连接", Toast.LENGTH_SHORT).show();
            }
        }
    });

2

构造卷帘区域点集

利用地图触摸事件,在事件监听中动态获取手势触摸的视图坐标位置,然后构建矩形Dots坐标点集。

//获取屏幕高宽
Resources resources = this.getResources();
DisplayMetrics dm = resources.getDisplayMetrics();
int height = dm.heightPixels;
int width = dm.widthPixels;

//地图触摸事件监听
private MapViewTouchListener touchListener = new MapViewTouchListener() {
    @Override
    public boolean mapViewTouch(MotionEvent event) {
        //构造四个坐标点,形成矩形区域
        dot1 = new Dot(0, 0); //地图视图左上角
        dot2 = new Dot(event.getX(), 0); //手势触摸点对应垂直方向的地图视图上方边界点
        dot3 = new Dot(event.getX(), height); //手势触摸点对应垂直方向的地图视图下方边界点
        dot4 = new Dot(0, height); //地图视图左下角

        dots = new Dots();
        //添加点到点集中
        dots.append(dot1);
        dots.append(dot4);
        dots.append(dot3);
        dots.append(dot2);
        dots.append(dot1); //点集首尾点相同
    }
};

3

图层卷帘

在图层、卷帘区域准备完成后,进行图层卷帘,刷新后即可查看到效果。

//地图卷帘
mapView.swipe(mapLayer, dots);
//刷新地图
mapView.refresh();

如果要停止图层卷帘,只需传递空MapLayer图层对象给swipe方法即可。例如:

//停止卷帘
mapView.swipe(null, null);

展示效果如下图所示:

水平卷帘.jpg

2 垂直卷帘

垂直卷帘的实现方法与水平卷帘的方法类似,区别只在于构造的Dots点集的不同。同样可以利用地图触摸事件监听,获取手势触摸位置,从而构造卷帘区域。

dot1 = new Dot(0, 0); //地图视图左上角
dot2 = new Dot(width, 0); //地图视图右上角
dot3 = new Dot(width, event.getY()); //手势触摸点对应水平方向的地图视图右方边界点
dot4 = new Dot(0, event.getY()); //手势触摸点对应水平方向的地图视图左方边界点

//添加点到点集中
dots.append(dot1);
dots.append(dot4);
dots.append(dot3);
dots.append(dot2);
dots.append(dot1);

//地图卷帘
mapView.swipe(mapLayer, dots);
//刷新地图
mapView.refresh();

展示效果如下图所示:

垂直卷帘.jpg

3 望远镜卷帘

望远镜卷帘效果,卷帘区域可以有多种样式,例如圆形、矩形、多边形等等,需要开发者自己构造点集合。例如下面代码即为模拟构造圆形边界点集合的方法。

int angle = 0;
int r = 250;
double PI = Math.PI;
Dot firstDot = new Dot();
//根据圆心、半径计算圆上的点
for (int i = 0; i <= 360; i = i + 5) {
    angle = i;
    double x = event.getX() + r * Math.cos(angle * PI / 180);
    double y = event.getY() + r * Math.sin(angle * PI / 180);
    Dot dot = new Dot(x, y);
    if (angle == 0) {
        firstDot = dot;
    }
    //添加点到dots中
    dots.append(dot);
}
//闭合
dots.append(firstDot);

//地图卷帘
mapView.swipe(mapLayer, dots);
//刷新地图
mapView.refresh();

展示效果如下图所示:

望远镜卷帘.jpg